package com.hfb.mashibing.alip8.juc.c020_01_interview;

import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.CountDownLatch;

/**
 * 面试题（淘宝？）
 * 实现一个容器，提供2个方法：add，size
 * 写2个线程，线程1添加10个袁术到容器中，
 * 线程2实现监控元数个数。当个数为5时线程2 提出提示并退出。
 *
 * 使用 CountDownLatch 解决此问题时，要使用2门栓，来协调2线程
 */
public class T05_CountDownLatch {
    // volatile 使线程间可见
    volatile List lis = new ArrayList();

    public void add(Object o) {
        lis.add(o);
    }
    public int size() {
        return lis.size();
    }

    public static void main(String[] args) throws InterruptedException {
        T05_CountDownLatch o = new T05_CountDownLatch();
        CountDownLatch latch1 = new CountDownLatch(1);
        CountDownLatch latch2 = new CountDownLatch(1);

        new Thread(()->{
            System.out.println("t2 启动");
            if (o.size() != 5) {
                try {
                    // 插上t2门栓，禁止自己运行
                    latch2.await();
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
            // 打开t1门栓，让t1继续执行
            latch1.countDown();
            System.out.println("t2 结束🔚 ");
        }, "t2").start();

        Thread.sleep(1000);


        new Thread(()->{
            System.out.println("t1 启动");
            for (int i=0;i<10;i++) {
                o.add(new Object());
                System.out.println("add "+i);

                if (o.size() == 5) {
                    System.out.println("够 "+(i+1)+" 了");
                    // 打开t2门栓，让t2执行
                    latch2.countDown();

                    try {
                        // 插上t1门栓，禁止自己运行
                        latch1.await();
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }

            }
            System.out.println("t1 结束🔚");
        }, "t1").start();



    }
}
